package com.future;

import java.util.Arrays;

/**
 * Description:
 * 统计字符串中的单词个数，这里的单词指的是连续的不是空格的字符。
 * <p>
 * 请注意，你可以假定字符串里不包括任何不可打印的字符。
 * <p>
 * 示例:
 * <p>
 * 输入: "Hello, my name is John"
 * 输出: 5
 * 解释: 这里的单词是指连续的不是空格的字符，所以 "Hello," 算作 1 个单词。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/number-of-segments-in-a-string
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2021/9/29 17:16
 */
public class Solution_434 {

    public static void main(String[] args) {
        String s = " H Hello, my name is John";
        s = "  A BB CCCS   akfl     ";
        s = "ABC aa fff ew 34sd llsdf";
        System.out.println("原始：" + s + " ，长度：" + s.length());
        System.out.println("trim：" + s.trim() + "，长度：" + s.trim().length());
        System.out.println("正则表达：" + Arrays.asList(s.trim().split("\\s+")) + "，长度：" + s.trim().split("\\s+").length);
        System.out.println("自己的：" + countSegments(s));
        System.out.println("答案：" + countSegments_v2(s));
    }

    /**
     * 思路：判断当前和前一个的关系
     * 1、当前不是空格，但是前一个是空格，开始算一个单词起点
     * 2、起点都不算
     *
     * @param s
     * @return
     */
    public static int countSegments(String s) {
        if (s == null || "".equals(s)) {
            return 0;
        }
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            // i == 0用的妙，如果第一个字符没有空格，就算起
            if ((i == 0 || s.charAt(i - 1) == ' ') && c != ' ') {
                count++;
            }
        }
        return count;
    }

    /**
     * 正则表达式
     *
     * @param s
     * @return
     */
    public static int countSegments_v1(String s) {
        String trimmed = s.trim();
        if (trimmed.equals("")) {
            return 0;
        }
        // 正则表达式中\s匹配任何空白字符，包括空格、制表符、换页符等等
        return trimmed.split("\\s+").length;
    }

    /**
     * @param s
     * @return
     */
    public static int countSegments_v2(String s) {
        int segmentCount = 0;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if ((i == 0 || s.charAt(i - 1) == ' ') && c != ' ') {
                segmentCount++;
            }
        }

        return segmentCount;
    }

}
